package com.ruoyi.framework.shiro.pam;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.authc.CustomizedToken;
import com.ruoyi.framework.shiro.enums.LoginType;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.realm.Realm;

import java.util.ArrayList;
import java.util.Collection;

//首先需要写一个类来继承ModularRealmAuthenticator
public class CustomizedModularRealmAuthenticator extends ModularRealmAuthenticator {
    //重写doAuthenticate()方法
    @Override
    protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) {
        assertRealmsConfigured();
        //获取当前登录的token将其强转成自定义token。
        CustomizedToken token = (CustomizedToken) authenticationToken;
        //通过强转的自定义token可以通过getLoginType()的方法获取到当前登录类型，将类型保存起来
        LoginType loginType = token.getLoginType();
        //获取所有的realm的名字
        Collection<Realm> realms = getRealms();//Collection<Realm>={"UserRealm","AdminRealm","MerchantsRealm"}
        Collection<Realm> typeRealms = new ArrayList<>();
        //通过循环去比对当前登录的用户名称包含在哪个realm里，用来决定用哪个realm来处理此次登录
        for (Realm realm : realms) {
            if (StringUtils.equals(realm.getName(), loginType.getType())) {
                typeRealms.add(realm);
            }
        }

        //判断符合条件的realm有几个当只有一个realm符合条件的时候就使用这个realm
        //当多个realm符合条件会使用所有的realm但当前项目中只有使用一个
        if (typeRealms.size() == 1) {
            return doSingleRealmAuthentication(typeRealms.iterator().next(), token);
        }
        return doMultiRealmAuthentication(typeRealms, token);
    }
}